package com.ryder.petmatediarybackend.common.enums;

import lombok.Getter;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 描述: 角色等级枚举
 *
 * <p>说明：
 * 该枚举定义了宠伴日记系统中的核心角色层级与权限范围。
 * 枚举设计遵循阿里巴巴开发规范，便于后续角色扩展与权限管理。</p>
 *
 * @author Ryder
 * @version 1.0
 * @since 1.0
 * 更新日期: 2025/10/25
 */
@Getter
public enum RoleLevelEnum {

    PET_OWNER(1, "ROLE_PET_OWNER", "宠物主人", "管理个人宠物档案、发布动态、预约服务"),
    SHOP_OWNER(2, "ROLE_SHOP_OWNER", "店铺经营者", "管理店铺信息、展示宠物/商品、处理预约与资质"),
    REGIONAL_AUDITOR(3, "ROLE_REGIONAL_AUDITOR", "区域审核员", "审核店铺资质与用户内容，处理违规"),
    REGIONAL_MANAGER(4, "ROLE_REGIONAL_MANAGER", "区域管理员", "管理区域审核员、区域用户与店铺，查看报表"),
    PLATFORM_ADMIN(9, "ROLE_PLATFORM_ADMIN", "平台管理员", "平台最高权限：全局管理、系统监控与公告发布");

    /**
     * 角色等级（数字越大权限越高）
     */
    private final Integer level;

    /**
     * 角色编码（系统内部标识）
     */
    private final String roleCode;

    /**
     * 中文名称（前端展示用）
     */
    private final String name;

    /**
     * 简短描述（权限说明）
     */
    private final String description;

    RoleLevelEnum(Integer level, String roleCode, String name, String description) {
        this.level = level;
        this.roleCode = roleCode;
        this.name = name;
        this.description = description;
    }

    /**
     * 根据角色等级获取枚举
     */
    public static RoleLevelEnum fromLevel(Integer level) {
        if (level == null) {
            return null;
        }
        return Arrays.stream(values())
                .filter(e -> e.level.equals(level))
                .findFirst()
                .orElse(null);
    }

    /**
     * 根据角色编码获取枚举
     */
    public static RoleLevelEnum fromCode(String roleCode) {
        if (roleCode == null) {
            return null;
        }
        return Arrays.stream(values())
                .filter(e -> e.roleCode.equalsIgnoreCase(roleCode))
                .findFirst()
                .orElse(null);
    }

    /**
     * 判断是否具备区域审核权限
     */
    public boolean canReviewRegion() {
        return this.level >= REGIONAL_AUDITOR.level;
    }

    /**
     * 判断是否具备区域管理权限
     */
    public boolean canManageRegion() {
        return this.level >= REGIONAL_MANAGER.level;
    }

    /**
     * 判断是否为超级管理员
     */
    public boolean isSuperAdmin() {
        return this == PLATFORM_ADMIN;
    }

    /**
     * 获取当前角色可访问的等级范围
     */
    public List<Integer> getAccessibleLevels() {
        return Arrays.stream(values())
                .filter(e -> e.level <= this.level)
                .map(RoleLevelEnum::getLevel)
                .collect(Collectors.toList());
    }

    /**
     * 获取所有具有管理权限的角色编码
     */
    public static List<String> getAllAdminRoleCodes() {
        return Arrays.stream(values())
                .filter(e -> e.level >= REGIONAL_AUDITOR.level)
                .map(RoleLevelEnum::getRoleCode)
                .collect(Collectors.toList());
    }
}